最近,一篇关于谷歌(Google)软件资源库(Google software repository)的文章揭示了软件开发的某些现状。文章介绍了起源于20世纪50年代的软件制造的历程,引出了一些通过软件从而改变了工作的重要组织方式。
谷歌软件资源库是谷歌公司25000名软件开发者中绝大多数人的重要资源。它保存了谷歌公司制造者获取的大批源代码。它协调每个程序员的工作,为开发团队提供支持,执行公司标准的工作流程,包括软件的创建、评估、批准和发布等方法。最令人感兴趣的是,单一的资源库能统一生产,能将编程人员凝聚到一个共同的组织中,与传统制造商采用工厂统一生产的方式如出一辙。事实上,谷歌代码资源库或许为如何组织软件工厂提供了最好的范例。
软件工厂的概念可以追溯到计算机时代的早期。几乎从一开始,计算机开发者就察觉到最终会有两种类型的工厂 ,一类是计算机硬件工厂,另一类是软件工厂。“我们这些工程师都曾经接受过采用工程生产线组织工作的训练”,最初的某个大型软件项目的领导者解释道。因此,他们采用同样的方式进行软硬件开发。
然而,在计算时代的最初二十年,软件开发者发现在工厂环境中要制造廉价而有效的软件是困难的。当他们试图为软件生产打造一个工厂环境时,他们发现软件制造远比大多数制造业要复杂得多。从根本上讲,传统制造业凭借对劳动的简单划分,才形成了可以用来协调劳动力的简便方式。它按照产品的组成部分来划分劳动。正是因为产品能被划分为“部分”,所以劳动力才能被划分为小组,分别负责产品的每个部分。工厂根据最终产品装配的先后顺序来组织这些小组,这样,产品的每个部分就能按照特定顺序被装配到最终的产品中。
事实证明,软件制造的复杂和多变远远超出传统制造业。软件制造不只使用一种划分劳动的方式,它使用过四种划分劳动力的手段,如时间或者空间,软件开发素材或者团队,乃至最终使用过程来划分人员。程序员在白天或者晚上、在办公室或者其他地方工作。他们一般只负责整个系统的一部分,并且有着稳定的同事团队。
不过,就大多数软件项目而言,很少是一成不变的。程序员能改变时间安排,能从国家的一个地方到另一个地方,修改一小段代码就会影响系统的其余部分,甚至每天都在换团队。这样,软件开发中唯一一个偏重于稳定的方面,过程(process),就成为用于劳动划分的最后工具。软件开发团队常常会在项目开发之初订立一个共同的过程并遵循它。因此,在20世纪80年代初,软件开发者曾断言:软件工厂是一个围绕共有的过程组织起来的机构。那个年代的软件工程师认为:“软件工厂由具有集成化、可扩展特性的软件开发工具集组成,它们支撑了一套值得称赞的方法。”
劳动划分只是工厂的一个方面。第二个方面是协调劳动,这个更复杂。20世纪大多数时期,工业工程师致力于采用信息交换最小化的方式来协调劳动。装配线(the assembly line)是最好的方式,能够使工人之间的交互最小。装配线上,一个工人占据一个单独的工位,并负责一个单一的任务。当未成品到达时,工人完成自己的任务,然后将产品送往装配线的下一站。工人从不与装配线上的其他工人直接交互。
从一开始,软件开发者就知道他们需要某种沟通渠道来协调团队工作。在计算时代的头几年,许多开发者使用纸质记录本来监测项目。该记录本应该包含设计规格说明书、文档、已完成代码的报告、设计变更以及与开发人员相关的全部其他信息。然而,对于许多项目而言,使用纸质记录本太简单,满足不了追踪软件生产动态性的要求。曾有传闻说早期操作系统的开发者记录本页数增长迅速,远超一个活页夹的容量,最终需要五英尺高的架子才能放下,并且一天就要修订150页。
如果软件工厂涉及劳动的动态划分、通用工具集和某种沟通渠道,并且贯彻执行一个共同的过程,那么它本身就不可能是个有形体。大约从1984年开始,软件开发者着手构建用于追踪新系统源代码、合并变更、存储软件以及提供变更检测手段的系统。这些系统中的许多方法之前都曾被实验过,但是将它们整合为统一的系统才刚刚开始尝试。20世纪80年代两个重要的软件资源库是沃尔特·蒂奇(Walter Tichy)在普渡大学开发的版本控制系统1(Revision Control System, RCS)和迪克·格伦(Dick Grune)在阿姆斯特丹开发的并行版本系统2(Concurrent Version System, CVS)。
CVS系统可能是20世纪90年代此类系统中最重要的。众多的开发者使其得到了发展,自由软件计划(Free Software Project)GNU组织对它进行了发布。开发者可以免费下载这个系统,甚至可以使用它来构建商业软件。它也成为了20世纪90年代开始蓬勃发展的开源开发(open source development)的通用工具。开源的倡导者想要的就是创建可以自由发布和自由修改的软件。自由软件计划GNU组织就是开源的早期代表。当前更多的代表有Mozilla浏览器、Apache HTML服务器以及Linux操作系统。
GIT3是更流行的软件资源库之一,是为了支撑Linux操作系统而诞生的。Linux由分布于世界各地的程序员社群所开发。它需要一个工具,保障开发人员能够下载代码、测试新想法、将想法展示给他人,以及让项目负责人能够接受或者拒绝这些想法。Linux曾一度使用过CVS,但是2005年创建了GIT后,就使用它来支撑自身的开发了。
除了也许是最知名的GIT外,目前大约有二十多种不同的软件资源库被普遍使用。有些是商业化的,有些是开源的,还有些是私有的,外界不能使用,如谷歌的软件资源库。它们通常都有一组常见的功能,如存储源代码、跟踪代码变更、文档化工作、允许进行审查、提供接受或者发布完整软件的渠道。从概念上来讲,它们往往有三类主要差异。首先,它们常常有不同的跟踪和合并变更的方式。变更特别具有挑战性,因为很可能会产生代码冲突的两个版本。软件资源库试图通过以下三种手段来避免这个问题,强迫程序员基于独立的代码副本工作,优先考虑高级别开发者所做的变更,以及追踪每一个每次的变更。
其次,软件资源库有不同的架构方式,以便使计算资源利用率最大。谷歌软件资源库是非同一般的,因为它包含了谷歌公司大部分的代码,而大量的软件资源库都比它小,并且只关注单一的项目或主题。
最后,这些资源库在验证、测试和提交最终代码方面的方式也不同。谷歌资源库将这些步骤的大部分都自动化了,迫使程序员必须遵循一个严谨的通用过程。而其他的资源库,如可公开访问的GitHub,就没有如此优良的规范。
软件资源库并不是早期软件开发者所设想的真正的软件工厂,尽管它们可能很相似。那些开发者明确地区分了编程(programming)和编码(coding)。对于他们而言,编程包括设计软件及其构建方式。相比之下,编码是机械性的工作,即逐条编写指令。编程应当由工程师完成,编码应当由一般工人完成。
近七十年的经验告诉我们,创建一个系统需要三遍。设计是第一遍,编码是第二遍,调试是第三遍。所有这些步骤都需要智力投入,都需要创造力,都需要规范。而这三者都不是那些装配线上忙于工作但思考不足的工人所能做的。
即便如此,软件资源库也提醒了我们,软件开发是一种制造方式,需要一系列的技能。它需要精妙的劳动划分、协调劳动的灵活手段和精心设计的用于验证工作的过程。在软件时代,那些任务只能借助软件来完成。正像工厂改变了曾经的家庭小作坊式的生产方式一样,软件资源库也扩大了曾经的工厂生产的范畴。
所有评论仅代表网友意见